<?php
/**
 * 基底クラス
 * このクラスを継承するオブジェクトは
 * 　インスタンスを生成するたびにユニークIDを設定される。
 * 　public function get_XXX();は、$object->XXX;でレスポンスを参照することができる。
 * 　public function set_XXX($VALUE);は、$object->XXX = $VALUE;で呼び出すことができる。ただしレスポンスはNULL前提。
 * 　
 */
class object
{
	/** ユニークID */
	protected $_uid;
	/** 条件メソッド：完全一致 */
	const SELECT_AGREE = '=';
	/** 条件メソッド（日本語）：完全一致 */
	const 完全一致 = '=';
	/** 条件メソッド：不一致 */
	const SELECT_DISAGREE = '<>';
	/** 条件メソッド（日本語）：不一致 */
	const 不一致 = '<>';
	/** 条件メソッド：大なり */
	const SELECT_LARGER = '>';
	/** 条件メソッド（日本語）：大なり */
	const 大なり = '>';
	/** 条件メソッド：小なり */
	const SELECT_SMALLER = '<';
	/** 条件メソッド（日本語）：小なり */
	const 小なり = '<';
	/** 条件メソッド：部分一致 */
	const SELECT_LIKE = '%';
	/** 条件メソッド（日本語）：部分一致 */
	const 部分一致 = '%';

	/**
	 * コンストラクタ
	 * ユニークIDを設定する
	 */
	public function __construct()
	{
		$this->_uid = uniqid('',TRUE);
	}

	/**
	 * UIDを返す
	 * @return string
	 */
	public function get_uid()
	{
		return $this->_uid;
	}

	/**
	 * ゲッター
	 */
	public function __getX($name) {
		$name = strtolower($name);
		$method = 'get_' .  $name;
		/***
		 * 継承クラスに get_XXX();メソッドがあるか
		 * あれば実行、なければエラー
		 */
		if (method_exists ( $this, $method )) {
			return call_user_func ( array (
					&$this,
					$method
			) );
		} else {
			trigger_error( 'Property ' . $name . '  does not exist');
		}
	}

	/**
	 * セッター
	 */
	public function __setX($name, $value) {
		$name = strtolower($name);
		$method = 'set_'.$name;
		/***
		 * 継承クラスに、set_XXX($value)があるか？
		 * あれば実行、無ければエラー
		 */
		if (method_exists($this, $method)) {
			return call_user_func( array(&$this, $method),$value);
		} else {
			trigger_error( 'Property ' . $name . '  does not exist');
		}
	}

	/**
	 * 設定された条件に一致する場合TRUEを返す
	 * @param $key プロパティー名
	 * @param $value 値
	 * @param $method 論理式
	 * @return boolean
	 */
	public function isYou($key, $value, $method) {
		/*** プロパティが存在しない場合はＦＡＬＳＥ */
		if (! property_exists ( $this, $key )) {
			return FALSE;
		}
		$objectVars = get_object_vars ( $this );
		$srcValue = $objectVars [$key];
		switch ($method) {
			case self::SELECT_AGREE :
				/*** 一致 */
				if ($srcValue == $value) {
					return TRUE;
				}
				break;
			case self::SELECT_DISAGREE :
				/*** 不一致 */
				if ($srcValue != $value) {
					return TRUE;
				}
				break;
			case self::SELECT_LARGER :
				/*** 大なり */
				if ($srcValue > $value) {
					return TRUE;
				}
				break;
			case self::SELECT_SMALLER :
				/*** 小なり */
				if ($srcValue < $value) {
					return TRUE;
				}
				break;
			case self::SELECT_LIKE :
				/*** 部分一致 */
				if (mb_strpos ( $srcValue, $value ) !== FALSE) {
					return TRUE;
				}
				break;
		}
		return FALSE;
	}
}